<?php

namespace app\admin\controller\demo;

use app\common\controller\CommonBaseController;
use app\common\utils\ApiReturn;
use app\Request;
use Error;
use Exception;
use think\facade\Queue;

/**
 * 队列生产者Demo
 */
class QueueProducerDemo extends CommonBaseController
{
    public function createQueue1(Request $request)
    {
        try {
            // 1.当前任务由哪个类来负责处理? 当轮到该任务时，系统将生成该类的实例，并调用其fire方法
            $jobHandlerClassName = 'app\job\test\TestConsumer';

            // 2.当任务归属的队列名称，如果为新队列，会自动创建
            $jobQueueName = "rxJobFirst";

            // 3.当前任务所需业务数据，写入队列时将转化为json形式的字符串
            $jobData = [
                'time' => time(),
                'id' => uniqid(),
                'str' => 'this is my test queue data',
            ];
            P($jobData);

            // 4.将任务推送到消息列表，等待对应的消费者去消费
            $isPushed = Queue::push($jobHandlerClassName, $jobData, $jobQueueName); //Queue::push立即执行

            //延迟执行的队列不会立即被消费,可以适用于特定的场景,比如:12306超过10分钟不支付就关闭订单; 订单确认收货后超过10小时自动收货;
            //$isPushed = Queue::later(600, $jobHandlerClassName, $jobData, $jobQueueName); //Queue::later延迟执行，单位秒

            // database 驱动时，返回值为 1|false
            // redis 驱动时，返回值为 随机字符串|false
            if ($isPushed !== false) {
                echo '消息推送成功';
            } else {
                echo '消息推送失败';
            }
        } catch (Exception|Error $e) {
            ApiReturn::retError($e);
        }
    }

    public function createQueue2(Request $request)
    {
        try {
            $jobQueueName = "rxJobSecond";
            $jobData = [
                'time' => time(),
                'id' => uniqid(),
                'str' => 'this is my second test queue data',
            ];
            P($jobData);

            //同时写入两个队列, 比如:
            //第一个队列是 订单支付成功后 通知财务进行钱款统计
            $jobHandlerFinance = 'app\job\test\OrderConsumer@taskFinance';
            if (Queue::push($jobHandlerFinance, $jobData, $jobQueueName) !== false) {
                echo 'OrderConsumer@taskFinance推送成功; ';
            } else {
                echo 'OrderConsumer@taskFinance推送失败; ';
            }

            //第二个队列是 订单支付成功后 通知物流系统进行发货
            $jobHandlerLogistics = 'app\job\test\OrderConsumer@taskLogistics';
            if (Queue::push($jobHandlerLogistics, $jobData, $jobQueueName) !== false) {
                echo 'OrderConsumer@taskLogistics推送成功; ';
            } else {
                echo 'OrderConsumer@taskLogistics推送失败; ';
            }
        } catch (Exception|Error $e) {
            ApiReturn::retError($e);
        }
    }
}